﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaEndereco
    {
        #region Variaveis Membro
        private int _idPessoaEndereco;
        private int _idPessoa;
        private TipoLogradouro _tipoLogradouro;
        private TipoEndereco _tipoEndereco;
        private string _logradouro;
        private string _numero;
        private string _complemento;
        private string _bairro;
        private Cidade _cidade;
        private double _cep;
        private StatusEndereco _statusEndereco;
        private string _path;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdPessoaEndereco
        {
            get { return _idPessoaEndereco; }
            set { _idPessoaEndereco = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public TipoLogradouro TipoLogradouro
        {
            get { return _tipoLogradouro; }
            set { _tipoLogradouro = value; }
        }
        public TipoEndereco TipoEndereco
        {
            get { return _tipoEndereco; }
            set { _tipoEndereco = value; }
        }
        public string Logradouro
        {
            get { return _logradouro; }
            set { _logradouro = value; }
        }
        public string Numero
        {
            get { return _numero; }
            set { _numero = value; }
        }
        public string Complemento
        {
            get { return _complemento; }
            set { _complemento = value; }
        }
        public string Bairro
        {
            get { return _bairro; }
            set { _bairro = value; }
        }
        public Cidade Cidade
        {
            get { return _cidade; }
            set { _cidade = value; }
        }
        public double Cep
        {
            get { return _cep; }
            set { _cep = value; }
        }
        public StatusEndereco StatusEndereco
        {
            get { return _statusEndereco; }
            set { _statusEndereco = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public PessoaEndereco()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaEndereco(int idPessoaEndereco)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idPessoaEndereco);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idPessoaEndereco)
        {
            try
            {

                var consulta = from pe in _context.tab_pessoa_endereco
                               where pe.Id_endereco == idPessoaEndereco
                               select new
                               {
                                   pe.Id_endereco,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.tab_tipo_logradouro.id_tipo_logradouro,
                                   pe.tab_tipo_endereco.id_tipo_endereco,
                                   pe.logradouro,
                                   pe.numero,
                                   pe.complemento,
                                   pe.bairro,
                                   pe.tab_cidade.id_cidade,
                                   pe.cep,
                                   pe.tab_status_endereco.id_status_endereco,
                                   pe.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idPessoaEndereco = list.Id_endereco;
                    this._idPessoa = list.Id_pessoa;
                    this._tipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);
                    this._tipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    this._logradouro = list.logradouro;
                    this._numero = list.numero;
                    this._complemento = list.complemento;
                    this._bairro = list.bairro;
                    this._cidade = new Cidade(list.id_cidade);
                    this._cep = list.cep;
                    this._statusEndereco = new StatusEndereco(list.id_status_endereco);
                    this._path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaEndereco> SelectAll()
        {
            try
            {
                List<PessoaEndereco> listPessoaEndereco = new List<PessoaEndereco>();

                var consulta = from pe in _context.tab_pessoa_endereco
                               select new
                               {
                                   pe.Id_endereco,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.tab_tipo_logradouro.id_tipo_logradouro,
                                   pe.tab_tipo_endereco.id_tipo_endereco,
                                   pe.logradouro,
                                   pe.numero,
                                   pe.complemento,
                                   pe.bairro,
                                   pe.tab_cidade.id_cidade,
                                   pe.cep,
                                   pe.tab_status_endereco.id_status_endereco,
                                   pe.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaEndereco pessoaEndereco = new PessoaEndereco();
                    pessoaEndereco.IdPessoaEndereco = list.Id_endereco;
                    pessoaEndereco.IdPessoa = list.Id_pessoa;
                    pessoaEndereco.TipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);
                    pessoaEndereco.TipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    pessoaEndereco.Logradouro = list.logradouro;
                    pessoaEndereco.Numero = list.numero;
                    pessoaEndereco.Complemento = list.complemento;
                    pessoaEndereco.Bairro = list.bairro;
                    pessoaEndereco.Cidade = new Cidade(list.id_cidade);
                    pessoaEndereco.Cep = list.cep;
                    pessoaEndereco.StatusEndereco = new StatusEndereco(list.id_status_endereco);
                    pessoaEndereco.Path = list.path;

                    listPessoaEndereco.Add(pessoaEndereco);
                }
                return listPessoaEndereco;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaEndereco> SelectPessoa(int idPessoa)
        {
            try
            {
                List<PessoaEndereco> listPessoaEndereco = new List<PessoaEndereco>();

                var consulta = from pe in _context.tab_pessoa_endereco
                               join p in _context.tab_pessoa on pe.tab_pessoa.Id_pessoa equals p.Id_pessoa
                               where p.Id_pessoa == idPessoa
                               select new
                               {
                                   pe.Id_endereco,
                                   pe.tab_pessoa.Id_pessoa,
                                   pe.tab_tipo_logradouro.id_tipo_logradouro,
                                   pe.tab_tipo_endereco.id_tipo_endereco,
                                   pe.logradouro,
                                   pe.numero,
                                   pe.complemento,
                                   pe.bairro,
                                   pe.tab_cidade.id_cidade,
                                   pe.cep,
                                   pe.tab_status_endereco.id_status_endereco,
                                   pe.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaEndereco pessoaEndereco = new PessoaEndereco();
                    pessoaEndereco.IdPessoaEndereco = list.Id_endereco;
                    pessoaEndereco.IdPessoa = list.Id_pessoa;
                    pessoaEndereco.TipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);
                    pessoaEndereco.TipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    pessoaEndereco.Logradouro = list.logradouro;
                    pessoaEndereco.Numero = list.numero;
                    pessoaEndereco.Complemento = list.complemento;
                    pessoaEndereco.Bairro = list.bairro;
                    pessoaEndereco.Cidade = new Cidade(list.id_cidade);
                    pessoaEndereco.Cep = list.cep;
                    pessoaEndereco.StatusEndereco = new StatusEndereco(list.id_status_endereco);
                    pessoaEndereco.Path = list.path;

                    listPessoaEndereco.Add(pessoaEndereco);
                }
                return listPessoaEndereco;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdPessoaEndereco == 0)
                {
                    tab_pessoa_endereco tabEndereco = new tab_pessoa_endereco();
                    tabEndereco.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabEndereco.tab_tipo_logradouroReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_logradouro", "id_tipo_logradouro", this.TipoLogradouro.IdTipoLogradouro);
                    tabEndereco.tab_tipo_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_endereco", "id_tipo_endereco", this.TipoEndereco.IdTipoEndereco);
                    tabEndereco.logradouro = this.Logradouro;
                    tabEndereco.numero = this.Numero;
                    if (this.Complemento != "")
                        tabEndereco.complemento = this.Complemento;
                    tabEndereco.bairro = this.Bairro;
                    tabEndereco.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", this.Cidade.IdCidade);
                    tabEndereco.cep = this.Cep;
                    tabEndereco.tab_status_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_endereco", "id_status_endereco", this.StatusEndereco.IdStatusEndereco);
                    if (this.Path != "")
                        tabEndereco.path = this.Path;

                    _context.AddTotab_pessoa_endereco(tabEndereco);
                    _context.SaveChanges();

                }
                else
                {
                    tab_pessoa_endereco tabEndereco = (from e in _context.tab_pessoa_endereco
                                                       where e.Id_endereco == this.IdPessoaEndereco
                                                       select e).First();

                    tabEndereco.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabEndereco.tab_tipo_logradouroReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_logradouro", "id_tipo_logradouro", this.TipoLogradouro.IdTipoLogradouro);
                    tabEndereco.tab_tipo_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_endereco", "id_tipo_endereco", this.TipoEndereco.IdTipoEndereco);
                    tabEndereco.logradouro = this.Logradouro;
                    tabEndereco.numero = this.Numero;
                    if (this.Complemento != "")
                        tabEndereco.complemento = this.Complemento;
                    tabEndereco.bairro = this.Bairro;
                    tabEndereco.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", this.Cidade.IdCidade);
                    tabEndereco.cep = this.Cep;
                    tabEndereco.tab_status_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_endereco", "id_status_endereco", this.StatusEndereco.IdStatusEndereco);
                    if (this.Path != "")
                        tabEndereco.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Excluir()
        {
            try
            {
                if (this.IdPessoaEndereco != 0)
                {
                    tab_pessoa_endereco tabEndereco = (from e in _context.tab_pessoa_endereco
                                                       where e.Id_endereco == this.IdPessoaEndereco
                                                       select e).First();

                    _context.DeleteObject(tabEndereco);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
